// 引入必要的模块和存储
import router, { asyncRoutes } from '@/router';
import { useUserStore } from '@/stores';
import nprogress from 'nprogress';
const whiteList = ['/login', '/404']; // 登录页 404白名单
import type { RouteRecordRaw } from 'vue-router';

// 前置导航守卫
// 只要是路由发生跳转-就会执行- 跳转之前执行
// to 到哪里去
// from 从哪里来
// next 必须执行的一个函数
router.beforeEach((to, from, next) => {
  nprogress.start(); // 开启进度条

  const store = useUserStore();
  const token = store.user?.token;
  // 获取用户角色和权限

  // 构建动态路由
  // 是否有 token
  if (token) {
    // 是否是登陆页
    if (to.path === '/login') {
      // 有 token 不需要登陆，直接跳转到主页
      next('/');
    } else {
      initDynamicRoutes();
      next();
    }
  } else {
    // 是否在白名单中
    if (whiteList.includes(to.path)) {
      next();
    } else {
      next('/login');
    }
  }

  nprogress.done();
});

/** 抽离动态添加路由(在main.ts app.use(router)前使用 解决刷新空白页) */
export function initDynamicRoutes() {
  let routes: any = [];
  const store = useUserStore();
  const userProfile = store.user;
  const role = userProfile?.role;
  const menus = role?.menus || [];
  menus.forEach(key => {
    // key 是标识
    // asyncRoutes 中找每个对象中的name是否和key相等 相等就找到了需要筛选出来，不相等就没找到 没有权限
    routes.push(...asyncRoutes.filter(item => item.name === key)); // 可能得到的是空数组
  });

  // 重新配置路由
  routes.forEach((r: RouteRecordRaw) => router.addRoute(r));
}
